package kov.display
{
	import com.riaoo.display.Animation;
	import com.riaoo.display.IFrameSequence;
	
	import flash.utils.Timer;
	
	/**
	 * 新增水平翻转、偏移量等功能。
	 * @author Y.Boy
	 */	
	public class AdvancedAnimation extends Animation
	{
		/**
		 * 是否水平翻转。
		 */		
		protected var _isFlip:Boolean;
		
		/**
		 * 水平偏移量。
		 */		
		protected var _offsetX:Number;
		
		/**
		 * 垂直偏移量。
		 */		
		protected var _offsetY:Number;
		
		/**
		 * 构造函数。
		 * @param timer
		 * @param frameSequence
		 * @param delay
		 * @param cache
		 */		
		public function AdvancedAnimation(timer:Timer, frameSequence:IFrameSequence=null, delay:Number=100, cache:Boolean=false)
		{
			super(timer, frameSequence, delay, cache);
			
			_isFlip = false;
			_offsetX = 0;
			_offsetY = 0;
		}
		
		/**
		 * 舞台上的像素坐标 x （左上角的点）。
		 */		
		public function get originalX():Number
		{
			return super.x;
		}
		
		/**
		 * 舞台上的像素坐标 y （左上角的点）。
		 */		
		public function get originalY():Number
		{
			return super.y;
		}
		
		/**
		 * 原点坐标 x （中心点，非左上角那点）。
		 */		
		override public function get x():Number
		{
			return _isFlip ? (super.x - (_offsetX - 1)) : (super.x + _offsetX);
		}
		
		override public function set x(value:Number):void
		{
			super.x = _isFlip ? (value + (_offsetX - 1)) : (value - _offsetX);
		}
		
		/**
		 * 原点坐标 y （中心点，非左上角那点）。
		 */		
		override public function get y():Number
		{
			return super.y + this.offsetY;
		}
		
		override public function set y(value:Number):void
		{
			super.y = value - this.offsetY;
		}
		
		/**
		 * 是否水平翻转。
		 */		
		public function get isFlip():Boolean
		{
			return _isFlip;
		}
		
		public function set isFlip(value:Boolean):void
		{
			if (_isFlip == value)
			{
				return;
			}
			
			var temp:Number = this.x; // 旧的坐标
			_isFlip = value;
			this.x = temp; // 把旧的坐标再次赋值，里头会重新判断是否翻转
			this.scaleX = -this.scaleX;
		}
		
		/**
		 * 水平偏移量。
		 */		
		public function get offsetX():Number
		{
			return _offsetX;
		}
		
		public function set offsetX(value:Number):void
		{
			var temp:Number = this.x;
			_offsetX = value;
			this.x = temp;
		}
		
		/**
		 * 垂直偏移量。
		 */		
		public function get offsetY():Number
		{
			return _offsetY;
		}
		
		public function set offsetY(value:Number):void
		{
			super.y = super.y + _offsetY - value
			_offsetY = value;
		}
		
	}
}